From: Jonathan Lebon Date: Mon, 15 Aug 2022 17:54:35 +0000 (-0400) Subject: lib/commit: Directly use FICLONE for payload link X-Git-Tag: archive/raspbian/2022.6-1+rpi1^2~7^2^2~27^2~1 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=93e47f88f486e5df1030066d0120b0db034ca6c8;p=ostree.git lib/commit: Directly use FICLONE for payload link The idea of payload linking is to reflink between objects where possible. Instead of relying on `glnx_regfile_copy_bytes` to hit the `FICLONE` path, just call `FICLONE` directly. At that point in the code, we've already established that the source and dest repos are on the same filesystem and that it supports `FICLONE`. Related: https://gitlab.gnome.org/GNOME/libglnx/-/merge_requests/41 Related: https://github.com/ostreedev/ostree/pull/2684#issuecomment-1204068437 --- diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 35b16c71..6cfdc32b 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -881,11 +881,8 @@ _try_clone_from_payload_link (OstreeRepo *self, else { /* This undoes all of the previous writes; we want to generate reflinked data. */ - if (ftruncate (tmpf->fd, 0) < 0) - return glnx_throw_errno_prefix (error, "ftruncate"); - - if (glnx_regfile_copy_bytes (fdf, tmpf->fd, -1) < 0) - return glnx_throw_errno_prefix (error, "regfile copy"); + if (ioctl (tmpf->fd, FICLONE, fdf) < 0) + return glnx_throw_errno_prefix (error, "FICLONE"); return TRUE; }